package com.aizuda.boot.modules.business.contract.service;

import com.aizuda.boot.modules.business.contract.dto.SingleResponse;
import com.aizuda.boot.modules.business.contract.entity.ContractEntity;
import com.aizuda.boot.modules.business.contract.entity.dto.*;
import com.aizuda.boot.modules.business.contract.entity.vo.*;
import com.aizuda.boot.modules.business.contract.entity.ContractTypeEntity;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * @author yangshen
 * @version 1.0
 * @date 2025/5/23
 */
public interface ContractService extends IService<ContractEntity> {
    /**
     * 获取合同列表（全部合同，我的合同，我的草稿）
     */
    Page<ContractDTO> getContractList(ContractListReqDTO dto);

    /**
     * 保存或提交合同
     */
    ContractDTO saevAndSubmitContract(ContractAddReqDTO dto);

    /**
     * 修改合同
     */
    void updateContract(ContractUpdateReqDTO dto);

    /**
     * 复制合同
     *
     * @param contractId
     * @return
     */
    Integer copyContract(Integer contractId);

    /**
     * 删除草稿合同
     */
    void deleteDraftContracts(List<Long> contractIds);


    /**
     * 获取合同详情
     *
     * @param contractId
     * @return
     */
    ContractDTO getContractDetail(Integer contractId);

    /**
     * 获取合同类型树
     *
     * @return
     */
    List<ContractTypeEntity> getAllContractTypesTree();

    /**
     * 获取最近合同类型
     *
     * @param employeeId
     * @param limit
     * @return
     */
    List<ContractTypeEntity> getRecentContractTypes(Long employeeId, int limit);

    /**
     * 提交合同进行审批
     *
     * @param contractId 合同ID
     */
    void submitContractForApproval(Integer contractId);

    /**
     * 获取我的合同和协商数量统计
     *
     * @param userId 用户ID
     * @return 合同和协商数量统计
     */
    ContractCountDTO getMyContractAndNegotiationCount(Long userId);

    /**
     * 查询我的合同（分类查询：我申请的、已审批、待审批）
     *
     * @param dto    查询条件
     * @param userId 用户ID
     * @return 合同列表
     */
    Page<ContractDTO> getMyContracts(MyContractQueryDTO dto, Long userId);

    /**
     * 确认合同附件
     *
     * @param contractId 合同ID
     * @param fileId     文件ID
     * @return 确认结果
     */
    boolean confirmContractAttachment(Integer contractId, Integer fileId);

    /**
     * 检查当前用户是否已确认所有合同附件
     *
     * @param contractId 合同ID
     * @return 是否已确认所有附件
     */
    boolean checkAllAttachmentsConfirmed(Integer contractId);

    /**
     * 发送"我改完了"通知给协商参与者
     *
     * @param contractId 合同ID
     * @return 发送结果
     */
    boolean sendModificationCompleteNotification(Integer contractId);

    /**
     * 查询交易方与我方签订的合同数量
     *
     * @param dto
     * @return
     */
    SingleResponse<CounterpartyContractStatusVO> getCounterpartyContractStatus(QueryCounterpartyContractDTO dto);

    /**
     * 查询交易方与我方签订的合同
     * @param dto
     * @return
     */
    SingleResponse<List<CounterpartyContractVO>> getSingleCounterpartyContracts(QueryCounterpartyContractDTO dto);

    /**
     * 查询交易方与我方签订的待签合同
     * @param dto
     * @return
     */
    SingleResponse<List<CounterpartyContractVO>> getPendingCounterpartyContracts(QueryCounterpartyContractDTO dto);

    /**
     * 判断是否为倒签合同
     * 倒签合同的标准：申请时间小于创建时间
     * @param contractId 合同ID
     * @return true-倒签合同，false-非倒签合同
     */
    Boolean isBackdatedContract(Integer contractId);

    /**
     * 获取简化的合同列表（支持模糊搜索）
     * @param request 查询请求
     * @return 合同列表分页结果
     */
    Page<ContractSimpleListVO> getSimpleContractList(ContractSimpleListReqDTO request);

    /**
     * 判断是否可以下载Word文件
     * 判断条件：1. 用户是管理员 2. 文件是Word文档格式（.doc/.docx）
     * @param fileId 文件ID
     * @return true-可以下载，false-不可以下载
     */
    Boolean canDownloadWord(String fileId);

    /**
     * 根据字段代码获取字段ID
     * @param fieldCode 字段代码
     * @return 字段ID，如果找不到返回null
     */
    Long getFieldIdByCode(String fieldCode);
}
